#ifndef __TREE_Node_H__
#define __TREE_Node_H__
#include "constant.h"
typedef enum
{
    DEFAULT_DATA,
    INT_DATA,
    FLOAT_DATA,
    STRING_DATA,
    ID_DATA,
    TYPE_DATA,
} data_type_t;
// func1 = (void * p) -> (int*)p;
// auto toType [] = [func1,func2,func3];
// func_get_datap = (nodedata_t data) -> toType[data.type](data.data)
typedef struct NodeData
{
    void *data; // 这里挖了个坑...要是不行就写unoin
    data_type_t data_type;
} node_data_t;

typedef enum
{
    LEX_NODE,
    SYNTAX_NODE,
} node_type_t;

typedef enum
{
    TRAVAL_PREORDER,  // 前序遍历
    TRAVAL_INORDER,   // 中序遍历
    TRAVAL_POSTORDER, // 后序遍历
} traval_type_t;

/**
 * @brief 树节点结构体
 *
 * 该结构体表示树的一个节点，包含节点的子节点、名称、数据及其类型等信息。
 *
 * @typedef tree_node_t
 *
 * @struct TreeNode
 * @var TreeNode::son
 * 子节点指针，指向该节点的子节点。
 *
 * @var TreeNode::name
 * 节点名称，字符数组。
 *
 * @var TreeNode::data
 * 节点数据，类型为 node_data_t。
 *
 * @var TreeNode::data_type
 * 数据类型，类型为 data_type_t。
 *
 * @var TreeNode::node_type
 * 节点类型，类型为 node_type_t。
 */
typedef struct TreeNode
{
    struct TreeNode *son;
    struct TreeNode *sibling;
    char name[MAX_NAME_LEN];
    node_data_t data;
    node_type_t node_type;
    int line_index;
} tree_node_t;

typedef struct TreeNode *tree_t;

typedef void (*traval_func_t)(tree_node_t *, int);

// 浅拷贝
node_data_t create_node_data(void *data, data_type_t data_type);

// 深拷贝
tree_node_t *create_and_init_node(char *name, node_data_t data, node_type_t node_type, int line_index);

// void update_node_data(tree_node_t *node, node_data_t data);

void add_sons(tree_node_t *parent, int son_num, ...);

void traval_tree(tree_t root, traval_type_t traval_type, traval_func_t func);

// void free_tree(tree_t * ptree);

void destroy_tree(tree_t *ptree);

void print_tree(tree_t * ptree);

#endif // __MNode_H__